"""
# PCA实战
"""
# 数字数据集的主成分分析

from sklearn import datasets
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

# 载入数据
digits_data = datasets.load_digits()
n = len(digits_data.images)

# 每张图像被表示为一个8x8数组。将数组扁平化，作为PCA的输入
image_data = digits_data.images.reshape((n, -1))
print(image_data.shape)

# 数字的真实值标签在每张图片中
labels = digits_data.target
print(labels)

# 为这个数据集拟合一个PCA转换器
# 自动选择主成分分析的数目，使主成分能解释至少80%原来的方差
pca_transformer = PCA(n_components=0.8)
pca_images = pca_transformer.fit_transform(image_data)
print(pca_transformer.explained_variance_ratio_[:3].sum())

# 结果可视化
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for i in range(100):
    ax.scatter(pca_images[i, 0], pca_images[i, 1], pca_images[i, 2], marker=r'${}$'.format(labels[i]), s=64)

ax.set_xlabel('Principal component 1')
ax.set_ylabel('Principal component 2')
ax.set_zlabel('Principal component 3')

plt.savefig('可视化/MNIST数据子集的PCA投影——标记对应于图像标签.png')
plt.show()

